看似只是消除方塊而已,邏輯複雜到我開始懷疑自己...
這邊我能力不足,沒辦法完成道具生成的功能,只好將就一下把方塊消除就好了,反正重點還是後面的影像辨識和外掛說起來都Day7了還在寫小遊戲真的很糟
首先先分成兩個部分,分別是橫的與直的兩種,接下來遍歷每個方塊,並且去尋找橫的與直的是否有無湊齊三塊以上
這種找法到最後會長這樣
x_match=[[0,0],[1,0],[2,0]]
y_match=[[0,0],[0,1],[0,2]]
如果想要做道具功能,就必須把這兩個資料合併在一起變這樣
match=[[0,0],[1,0],[2,0],[0,1],[0,2]]
但目前我還不知道要怎麼去合併,以後如果有空再回來想想看
那就可以開始來寫尋找方塊的邏輯了,這邊也有用到遞迴去尋找下一個方塊
check_is_matched_x = []
check_is_matched_y = []
match_x = []
match_y = []
def nextMatchX(self, x, y, x_count):
if x + 1 < NUMGRID and self.getGemByPos(x, y).type == self.getGemByPos(x+1, y).type:
# 尋找下一個
self.nextMatchX(x+1, y, x_count+1)
# match end
else:
# 找到連貫的方塊
if x_count >= 2:
m = []
for mx in range(x - x_count, x + 1, 1):
m.append([mx, y])
self.check_is_matched_x.append([mx, y])
self.match_x.append(m)
return
def nextMatchY(self, x, y, y_count):
if y + 1 < NUMGRID and self.getGemByPos(x, y).type == self.getGemByPos(x, y+1).type:
# 尋找下一個
self.nextMatchY(x, y+1, y_count+1)
# match end
else:
# 找到連貫的方塊
if y_count >= 2:
m = []
for my in range(y - y_count, y + 1, 1):
m.append([x, my])
self.check_is_matched_y.append([x, my])
self.match_y.append(m)
return
再來測試看看
# 測試用
elif pygame.mouse.get_pressed()[2] == True:
for x in range(NUMGRID):
for y in range(NUMGRID):
if [x, y] not in self.check_is_matched_x:
self.nextMatchX(x, y, 0)
if [x, y] not in self.check_is_matched_y:
self.nextMatchY(x, y, 0)
if self.match_x != []:
for match_x in self.match_x:
self.matches.append(match_x)
if self.match_y != []:
for match_y in self.match_y:
self.matches.append(match_y)
print(self.matches)
得到的這個self.matches就是配對結果囉
接下來就用上次的removeMatched來試一下
# 如果有方塊符合,則消除
if self.matches != [] and pygame.time.get_ticks() - match_ticks >= 500:
self.removeMatched(self.matches)
self.matches = []
self.check_is_matched_x = []
self.check_is_matched_y = []
self.match_x = []
self.match_y = []
match_ticks = pygame.time.get_ticks()
到這邊其實有很多地方可以優化的,但畢竟我是小小的社畜,也很難有時間可以去優化它,就這樣給它爛吧
最後就是被消掉的方塊需要新增補上,並且要能自動配對與消除,希望明天可以把這個小遊戲完成